﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

namespace welwitschia.Administracao
{
    public partial class UtilizadorDetalhe : PaginaBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!Page.IsPostBack)
            {
                String[] allRoles = Roles.GetAllRoles();

                lvGrupos.DataSource = allRoles;
                lvGrupos.DataBind();

                if(!String.IsNullOrEmpty(Request.QueryString["un"]))
                {
                    hfNomeUtilizador.Value = Request.QueryString["un"];
                    MembershipUserCollection users = Membership.FindUsersByName(Request.QueryString["un"].ToString());
                    if (users.Count > 1)
                    {
                        throw new Exception("Foi encontrado mais que um utilizador com o mesmo nome");
                    }
                    else if (users.Count < 1)
                    {
                        throw new Exception("Não foi encontrado qualquer utilizador com o nome de utilizador indicado");
                    }

                    MembershipUser user = users[hfNomeUtilizador.Value];

                    String[] currentRoles = Roles.GetRolesForUser(user.UserName);
                    CheckBox chk;
                    Label lbl;
                    foreach (String currentRole in currentRoles)
                    {
                        foreach (ListViewDataItem item in lvGrupos.Items)
                        {
                            lbl = item.FindControl("lblNomegrupo") as Label;
                            if (lbl.Text == currentRole)
                            {
                                chk = item.FindControl("chkGrupo") as CheckBox;
                                chk.Checked = true;
                            }
                        }
                    }

                    txtEmail.Text = user.Email;
                    txtNomeUtilizador.Text = user.UserName;
                }


            }
        }

        protected void btnGravar_Click(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(hfNomeUtilizador.Value))
                {
                    MembershipUser newUser = Membership.CreateUser(txtNomeUtilizador.Text, txtPassword.Text, txtEmail.Text);
                    //newUser.Comment = comment.Text;
                    //Membership.UpdateUser(newUser);
                  
                }
                else
                {
                    hfNomeUtilizador.Value = Request.QueryString["un"];
                    MembershipUserCollection users = Membership.FindUsersByName(Request.QueryString["un"].ToString());
                    if (users.Count > 1)
                    {
                        throw new Exception("Foi encontrado mais que um utilizador com o mesmo nome");
                    }
                    else if (users.Count < 1)
                    {
                        throw new Exception("Não foi encontrado qualquer utilizador com o nome de utilizador indicado");
                    }

                    MembershipUser user = users[hfNomeUtilizador.Value];

                    user.Email = txtEmail.Text;
                    Membership.UpdateUser(user);
                }

                CheckBox chk;
                Label lbl;
                Boolean isInRole;
                // Add Roles.
                foreach (ListViewDataItem item in lvGrupos.Items)
                {

                    chk = item.FindControl("chkGrupo") as CheckBox;
                    lbl = item.FindControl("lblNomegrupo") as Label;
                    isInRole = Roles.IsUserInRole(txtNomeUtilizador.Text, lbl.Text);
                    if (chk.Checked && !isInRole)
                        Roles.AddUserToRole(txtNomeUtilizador.Text, lbl.Text);
                    else if (!chk.Checked && isInRole)
                        Roles.RemoveUserFromRole(txtNomeUtilizador.Text, lbl.Text);
                }

                Response.Redirect(@"~\Administracao\UtilizadoresLista.aspx");
            }
            catch (MembershipCreateUserException mcex)
            {

                String mensagem = ConverteStatusCode(mcex.StatusCode);
                if (String.IsNullOrEmpty(mensagem))
                    MostraErro(mcex.Message);
                else
                    MostraAviso(mensagem);
            }
            catch (Exception ex)
            {
                MostraErro(ex.Message);
            }
        }

        protected void btnVoltar_Click(object sender, EventArgs e)
        {
            Response.Redirect(@"~\Administracao\UtilizadoresLista.aspx");
        }

        private String ConverteStatusCode(MembershipCreateStatus codigo)
        {
            switch (codigo)
            {
                case MembershipCreateStatus.InvalidPassword:
                    return "Senha inválida. A senha deve ter pelo menos 6 caracteres!";
                case MembershipCreateStatus.DuplicateUserName:
                    return "O nome de utilizador já existe!";
                default:
                    return String.Empty;
            }
        }
    }
}